<template>
  <div class="container">
    <van-nav-bar title="搜索中心" left-arrow @click-left="$router.back()" />
    <!-- 搜索框 -->
    <van-search
      v-model="keyWord"
      shape="round"
      placeholder="请输入搜索关键词"
      @search="onSearch"
    />
    <!-- 搜索联想词 -->
    <van-cell-group class="suggest-box" v-if="keyWord">
      <!-- span高亮联想关键词 -->
      <van-cell
        @click="onSearch(sug.replace(`<span>${keyWord}</span>`, keyWord))"
        icon="search"
        v-for="(sug, i) in sugs"
        :key="i"
        ><p v-html="sug"></p
      ></van-cell>
    </van-cell-group>
    <!-- 搜索历史 -->
    <div class="history-box" v-else-if="historyList.length">
      <div class="head">
        <span>历史记录</span>
        <van-icon @click="delAll" name="delete"></van-icon>
      </div>
      <van-cell-group>
        <van-cell v-for="(item, i) in historyList" :key="i">
          <a class="word_btn" @click="onSearch(item)">{{ item }}</a>
          <van-icon
            @click="delHistory(i)"
            class="close_btn"
            slot="right-icon"
            name="cross"
          />
        </van-cell>
      </van-cell-group>
    </div>
  </div>
</template>

<script>
/**
 * 保存用户的搜索记录=》之前搜索的关键词
 * 1. 设计数据结构，存储历史搜索关键词=》localStorage
 *    * 数据结构：['疫情','小米']
 * 2. 根据存储的数据渲染显示
 * 3. 存储搜索历史记录=》搜索、点击历史记录、点击联想词
 * 4. 操作搜索历史记录=>删除和清空
 */
// mock 假数据
// const historyList = ['疫情', '黑马', '小米']
// localStorage.setItem(TT_SEARCHS, JSON.stringify(historyList))
/**
 * 搜索联想词
 * 实现思路：
 * 1. 获取用户输入的关键词=》调用接口=》查询联想词
 * 2. 渲染联想词列表
 */
import { suggest } from '@/api/article'
const TT_SEARCHS = 'TT_SEARCHS'
export default {
  name: 'search-index',
  data () {
    return {
      // 搜索关键词
      keyWord: '',
      // 搜索历史记录列表=> 默认从本地存储获取
      historyList: JSON.parse(localStorage.getItem(TT_SEARCHS)) || [],
      // 联想词列表
      sugs: []

    }
  },
  watch: {
    keyWord () {
      /**
       * 每次输入都会执行？=》函数防抖=》定时器setTimeout
       * 函数防抖特点：
       * 1. 规定时间内重复的任务都会被取消
       * 2. 不能保障规定时间内定时器任务一定执行一次
       */
      this.timer && clearTimeout(this.timer)
      this.timer = setTimeout(async () => {
        console.log('搜索关键词', this.keyWord)
        /**
         * 1. 关键词是空，清空联想词列表
         * 2. 调用接口获取联想词渲染
         */
        if (!this.keyWord) {
          this.sugs = []
          return
        }
        const { data } = await suggest(this.keyWord)
        /**
         * 模板：<span>关键词</span>补全
         * 处理数据：关键词使用span包裹
         */
        this.sugs = data.options.map((item) => item.replace(this.keyWord, `<span>${this.keyWord}</span>`))
        // console.log(this.sugs)
      }, 600)
    }
  },
  methods: {
    /**
     * 什么时候触发？
     * 1. PC端按回车键
     * 2. 手机端打字的软键盘上的确定/enter
     */
    /**
     * keyWord 搜索关键词
     */
    onSearch (keyWord) {
      console.log('搜索新闻', keyWord)
      /**
       * 1. 存储搜索历史记录=》排重=》存到本地
       * 2. 携带关键词跳转到搜索结果页
       */
      if (!keyWord) return
      // 这个关键词之前没有存过=》执行存储
      if (!this.historyList.includes(keyWord)) {
        this.historyList.push(keyWord)
        // 更新本地（刷新后还在）
        localStorage.setItem(TT_SEARCHS, JSON.stringify(this.historyList))
      }
      this.$router.push({ path: '/search/result', query: { q: keyWord } })
      // console.log('mm', keyWord)
    },
    // 删除某个搜索历史
    delHistory (i) {
      this.historyList.splice(i, 1)
      // 更新本地（刷新后还在）
      localStorage.setItem(TT_SEARCHS, JSON.stringify(this.historyList))
    },
    // 删除所有搜索历史
    delAll () {
      this.historyList = []
      // 更新本地（刷新后还在）
      localStorage.setItem(TT_SEARCHS, JSON.stringify(this.historyList))
    }
  }
}
</script>

<style scoped lang='less'>
.suggest-box {
  /deep/ .van-cell {
    padding: 10px 20px;
    color: #999;
    p {
      span {
        color: red;
      }
    }
  }
}
.history-box {
  padding: 0 20px;
  .head {
    line-height: 36px;
    color: #999;
    text-align: left;
    .van-icon {
      font-size: 16px;
      float: right;
      margin-top: 10px;
    }
  }
  .van-cell {
    padding: 10px 0;
  }
  .word_btn {
    color: #3296fa;
  }
  .close_btn {
    margin-top: 5px;
    color: #999;
  }
}
</style>
